Type de données : REFERENCE TO
Important
Avec la version du compilateur >= V3.3.0.0, les références (avec 0) sont initialisées.
Important
Si une référence pointe vers une entrée d'appareil, l'accès est considéré comme un accès en écriture. Cela conduit à l'avertissement du compilateur lors de la génération de code ...kein gültiges Zuordnungsziel
.
Exemple: rInput REF= Input;
Si vous avez besoin d'une construction de ce type, vous avez besoin de la valeur d'entrée, par exemple rInput
, première copie dans une variable avec accès en écriture.
Une référence avec le REFERENCE
le type de données fait implicitement référence à un autre objet. La mission se fait avec le REF=
opérateur. Lors de l'accès, la référence est implicitement déréférencée et ne nécessite donc pas d'opérateur de contenu spécial ^
comme un pointeur.
syntaxe
<identifier> : REFERENCE TO <data type> ; <data type>: base type of the reference
PROGRAM PLC_PRG VAR rspeA : REFERENCE TO DUT_SPECIAL; pspeA : POINTER TO DUT_SPECIAL; speB : DUT_SPECIAL; END_VAR rspeA REF= speB; // Reference rspeA is alias for speB. The code corresponds to pspeA := ADR(speB); rspeA := speD; // The code corresponds to pspeA^ := speD;
ariTest : ARRAY[0..9] OF REFERENCE TO INT; priTest : POINTER TO REFERENCE TO INT; rriTest : REFERENCE TO REFERENCE TO INT; rbitTest : REFERENCE TO BIT;
Un type référence ne peut pas être utilisé comme type de base d'un tableau, d'un pointeur ou d'une référence. De plus, une référence ne doit pas faire référence à une variable de bit. De telles constructions génèrent des erreurs de compilation.
Note
La lisibilité d'un programme est rendue difficile lorsqu'on accède simultanément à une même cellule mémoire au moyen d'un identifiant et de son alias.
Exemple: speB
et rspeA
Astuce
Références et pointeurs vers BIT
les variables sont non valide déclarations, ainsi que des éléments de tableau avec type de base BIT
.
Lorsque des références sont attribuées avec :=
, une valeur est toujours copiée, que la référence soit à gauche, à droite ou des deux côtés :
Ref := value
écrit la valeurvalue
à l'endroit où pointe la référence. En notation pointeur :Ref^ := value
value := Ref
écrit la valeur à laquelle pointe la référence aprèsvalue
. En notation pointeur :value := Ref^
Ref1 := Ref2
écrit la valeur quiRef2
pointe vers. à l'endroit oùRef1
pointe vers. En notation pointeur :Ref1^ := Ref2^
Quand REF=
est utilisé, l'adresse est toujours appliquée et il doit y avoir une référence sur le côté gauche :
Ref REF= value
: La référence pointe versvalue
. En notation pointeur :Ref :=ADR(value)
Ref1 REF= Ref2
:Ref1
pointe vers la même valeur queRef2
. En notation pointeur :Ref1 := Ref2
Value REF = Ref
conduit à une erreur de compilation
Astuce
Dans la déclaration, REFERENCE TO INT REF= value
se comporte comme REFERENCE TO INT := value
.
Comparaison de la référence et du pointeur
Plus facile à utiliser :
Une référence peut accéder directement au contenu de l'objet référencé sans déréférencement.
Syntaxe plus agréable et plus simple lors du passage des valeurs :
Appel d'un bloc fonction qui passe une référence sans opérateur d'adresse au lieu d'un pointeur
Exemple:
fbDoIt(riInput:=iValue);
À la place de:
fbDoIt_1(piInput:=ADR(iValue));
Type de sécurité :
Lors de l'affectation de deux références, le compilateur vérifie si leurs types de base correspondent. Ceci n'est pas vérifié dans le cas des pointeurs.
Tester la validité d'une référence
Vous pouvez utiliser l'opérateur __ISVALIDREF
pour vérifier si une référence pointe vers une valeur valide (c'est-à-dire une valeur non égale à 0).
Syntaxe
<boolean variable name> := __ISVALIDREF( <reference name> );
<reference name>
: Identifiant déclaré avec REFERENCE TO
La variable booléenne est TRUE
lorsque la référence pointe vers une valeur valide. Sinon c'est FALSE
.
PROGRAM PLC_PRG VAR iAlfa : INT; riBravo : REFERENCE TO INT; riCharlie : REFERENCE TO INT; bIsRef_Bravo : BOOL := FALSE; bIsRef_Charlie : BOOL := FALSE; END_VAR iAlfa := iAlfa + 1; riBravo REF= iAlfa; riCharlie REF= 0; bIsRef_Bravo := __ISVALIDREF(riBravo); (* becomes TRUE, because riBravo references to iAlfa, which is non-zero *) bIsRef_Charlie := __ISVALIDREF(riCharlie); (* becomes FALSE, because riCharlie is set to 0 *)
Astuce
Dans la version 3.5.7.40 et supérieure du compilateur, la fonction de surveillance implicite CheckPointer agit sur des variables de type REFERENCE TO
de la même manière que pour les variables pointeur.